package ar.edu.unrn.lia.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.persistence.OptimisticLockException;
import javax.persistence.PersistenceException;

import org.primefaces.event.SelectEvent;
import org.primefaces.model.SortMeta;
import org.primefaces.model.SortOrder;

import ar.edu.unrn.lia.bean.datamodel.LazyGaranteDataModel;
import ar.edu.unrn.lia.model.Garante;
import ar.edu.unrn.lia.service.GaranteService;

@ManagedBean(name = "garanteBean")
@ViewScoped
public class GaranteBean extends GenericBean<Garante> implements
		Serializable {

	private static final long serialVersionUID = -8099682642901250002L;

	@ManagedProperty(value = "#{garanteService}")
	GaranteService entityService;
	
	

	public String create() {
		setEntity(new Garante());
		return REDIRECT_CREATE;
	}

	public void onRowSelect(SelectEvent event) {
		agregarMensaje(FacesMessage.SEVERITY_INFO, "Garante Seleccionado:",
				((Garante) event.getObject()).getNombre());
	}

	public String update() {
		try {
			if (getEntity().getId() == null) {
				entityService.save(getEntity());
				mensajeFlash("Crear Garante y Cuenta",
						"Operación realizada con exito. Cuenta: "
								+ getEntity().getCuenta().getNombre());

			} else {
				entityService.update(getEntity());
				mensajeFlash("Modificar Garante",
						"Operación realizada con exito.");
			}
			return REDIRECT_SEARCH;
		} catch (OptimisticLockException e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Bloqueo",
					"Alquien modificó este Garante, reconsulte.");
			return null;
		} catch (Exception e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage());
			return null;
		}
	}

	public String delete(Garante entity) {
		try {

			entityService.delete(entity);
			mensajeFlash("Eliminar Garante", "Operación realizada con exito.");
			return REDIRECT_SEARCH;
		} catch (OptimisticLockException e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Bloqueo",
					"Alquien modificó este Garante, reconsulte.");
			return null;
		} catch (PersistenceException e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Eliminar Garante",
					"El Garante esta asociada a un Alquiler.");
			return null;
		} catch (Exception e) {
			agregarMensaje(FacesMessage.SEVERITY_ERROR, "Eliminar Garante",
					e.getMessage());
			return null;
		}
	}
	
	
	@PostConstruct
	public void init() {
		//Default Orden Multiple Init
			setSortDefault(new ArrayList<SortMeta>(0));		
			getSortDefault().add(defaultFiltro("formentity:list:nombre", "nombre",SortOrder.ASCENDING  ));
			getSortDefault().add(defaultFiltro("formentity:list:apellido", "apellido", SortOrder.ASCENDING ));  
	    //Default Orden Multiple
	    
		setModelLazy(new LazyGaranteDataModel(entityService));
	}

	public List<Garante> listAll() {
		return entityService.getAll();
	}

	public void inicio() {
		if (!FacesContext.getCurrentInstance().isPostback()) {
			if (getId() != null) {
				setEntity(entityService.getEntityById(getId()));
			} else {
				setEntity(new Garante());
			}
		}
	}

	public void setEntityService(GaranteService entityService) {
		this.entityService = entityService;
	}

	public GaranteService getEntityService() {
		return entityService;
	}

}
